// Package service 实现业务逻辑层
// 该包提供用户相关的业务逻辑处理功能
package service

import (
	"aigen-todo/internal/interfaces"
	"aigen-todo/internal/models"
	"time"

	"golang.org/x/crypto/bcrypt"
)

// UserService 用户服务结构体
// 实现了用户相关的业务逻辑处理
type UserService struct {
	// userRepo 用户仓库接口，用于数据访问
	userRepo interfaces.UserRepositoryInterface
}

// NewUserService 创建新的用户服务实例
// 参数:
//
//	userRepo - 用户仓库接口实现
//
// 返回值:
//
//	*UserService - 用户服务实例
func NewUserService(userRepo interfaces.UserRepositoryInterface) *UserService {
	return &UserService{userRepo: userRepo}
}

// Register 用户注册功能
// 参数:
//
//	username - 用户名
//	email - 邮箱地址
//	password - 密码
//
// 返回值:
//
//	*models.User - 创建的用户模型
//	error - 注册错误信息
func (s *UserService) Register(username, email, password string) (*models.User, error) {
	// 检查用户是否已存在
	_, err := s.userRepo.GetByUsername(username)
	if err == nil {
		return nil, ErrUserAlreadyExists
	}

	// 检查邮箱是否已存在
	_, err = s.userRepo.GetByEmail(email)
	if err == nil {
		return nil, ErrUserAlreadyExists
	}

	// 加密密码
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return nil, err
	}

	// 创建用户
	user := &models.User{
		Username: username,
		Email:    email,
		Password: string(hashedPassword),
	}

	err = s.userRepo.Create(user)
	if err != nil {
		return nil, err
	}

	return user, nil
}

// Login 用户登录功能
// 参数:
//
//	username - 用户名或邮箱
//	password - 密码
//
// 返回值:
//
//	*models.User - 登录的用户模型
//	error - 登录错误信息
func (s *UserService) Login(username, password string) (*models.User, error) {
	// 获取用户
	user, err := s.userRepo.GetByUsername(username)
	if err != nil {
		// 尝试通过邮箱查找
		user, err = s.userRepo.GetByEmail(username)
		if err != nil {
			return nil, ErrInvalidCredentials
		}
	}

	// 验证密码
	err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
	if err != nil {
		return nil, ErrInvalidCredentials
	}

	return user, nil
}

// GetUserByID 根据ID获取用户
// 参数:
//
//	id - 用户ID
//
// 返回值:
//
//	*models.User - 用户模型指针
//	error - 查询错误信息
func (s *UserService) GetUserByID(id uint64) (*models.User, error) {
	return s.userRepo.GetByID(id)
}

// UpdateUser 更新用户信息
// 参数:
//
//	user - 用户模型指针
//
// 返回值:
//
//	error - 更新错误信息
func (s *UserService) UpdateUser(user *models.User) error {
	user.UpdatedAt = time.Now()
	return s.userRepo.Update(user)
}

// DeleteUser 删除用户（软删除）
// 参数:
//
//	id - 用户ID
//
// 返回值:
//
//	error - 删除错误信息
func (s *UserService) DeleteUser(id uint64) error {
	return s.userRepo.Delete(id)
}
